package com.alax.interfaces.domain.dto;

import com.alax.common.annotation.Excel;
import com.alax.common.core.domain.BaseEntity;
import com.alax.interfaces.domain.ApiInfo;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.*;
import java.util.List;

/**
 * API信息DTO对象
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class ApiInfoDTO extends BaseEntity {
    private static final long serialVersionUID = 1L;

    /** API ID */
    private Long id;

    /** API名称 */
    @NotBlank(message = "API名称不能为空")
    @Size(min = 2, max = 100, message = "API名称长度必须在2-100个字符之间")
    private String name;

    /** API描述 */
    @Size(max = 500, message = "API描述长度不能超过500个字符")
    private String description;

    /** 分类ID */
    @NotNull(message = "分类ID不能为空")
    private Long categoryId;

    /** 请求方法 */
    @NotBlank(message = "请求方法不能为空")
    @Pattern(regexp = "^(GET|POST|PUT|DELETE)$", message = "请求方法必须是GET、POST、PUT或DELETE")
    private String method;

    /** 接口地址 */
    @NotBlank(message = "接口地址不能为空")
    @Size(max = 255, message = "接口地址长度不能超过255个字符")
    private String url;

    /** 状态(0:下线 1:上线 2:维护) */
    @NotNull(message = "状态不能为空")
    @Min(value = 0, message = "状态值必须在0-2之间")
    @Max(value = 2, message = "状态值必须在0-2之间")
    private Integer status;

    /** 请求参数JSON格式 */
    private String requestParams;

    /** 返回示例 */
    private String responseExample;

    /** 每日调用限制 */
    @NotNull(message = "每日调用限制不能为空")
    @Min(value = 1, message = "每日调用限制必须大于0")
    private Long dailyLimit;

    /** 每秒请求数限制 */
    @NotNull(message = "QPS限制不能为空")
    @Min(value = 1, message = "QPS限制必须大于0")
    private Long qpsLimit;

    /** 是否需要认证(0:否 1:是) */
    @NotNull(message = "认证要求不能为空")
    @Min(value = 0, message = "认证要求必须是0或1")
    @Max(value = 1, message = "认证要求必须是0或1")
    private Integer authRequired;

    /** 备注 */
    @Size(max = 500, message = "备注长度不能超过500个字符")
    private String remark;

    /**
     * 转换为ApiInfo实体
     */
    public ApiInfo toEntity() {
        ApiInfo apiInfo = new ApiInfo();
        apiInfo.setId(this.id);
        apiInfo.setName(this.name);
        apiInfo.setDescription(this.description);
        apiInfo.setCategoryId(this.categoryId);
        apiInfo.setMethod(this.method);
        apiInfo.setUrl(this.url);
        apiInfo.setStatus(this.status);
        apiInfo.setRequestParams(this.requestParams);
        apiInfo.setResponseExample(this.responseExample);
        apiInfo.setDailyLimit(this.dailyLimit);
        apiInfo.setQpsLimit(this.qpsLimit);
        apiInfo.setAuthRequired(this.authRequired);
        apiInfo.setRemark(this.remark);
        return apiInfo;
    }
} 